package cn.wetcland.es.utils;

import cn.wetcland.es.config.exception.CustomerException;
import cn.wetcland.es.config.exception.CustomerExceptionTypeEnum;
import lombok.Data;

@Data
public class AjaxResponse {

    /**
     * 请求是否处理成功
     */
    private boolean flag;

    /**
     * 请求响应状态码（200、400、500、999）
     */
    private int code;

    /**
     * 请求结果描述信息
     */
    private String message;

    /**
     * 请求结果数据（通常用于查询操作）
     */
    private Object data;

    private AjaxResponse() {}

    /**
     * 请求出现异常时的响应数据封装
     * @param customerException 自定义异常
     * @return AjaxResponse
     */
    public static AjaxResponse error(CustomerException customerException) {
        AjaxResponse ajaxResponse = new AjaxResponse();
        ajaxResponse.setFlag(false);
        ajaxResponse.setCode(customerException.getCode());
        ajaxResponse.setMessage(customerException.getMessage());
        return ajaxResponse;
    }

    /**
     * 请求出现异常时的响应数据封装
     * @param customerExceptionTypeEnum 自定义异常枚举
     * @param errorMessage 错误提示消息
     * @return AjaxResponse
     */
    public static AjaxResponse error(CustomerExceptionTypeEnum customerExceptionTypeEnum, String errorMessage) {
        AjaxResponse ajaxResponse = new AjaxResponse();
        ajaxResponse.setFlag(false);
        ajaxResponse.setCode(customerExceptionTypeEnum.getCode());
        ajaxResponse.setMessage(errorMessage);
        return ajaxResponse;
    }

    /**
     * 请求出现异常时的响应数据封装
     * @param customerExceptionTypeEnum 自定义异常枚举
     * @param errorMessage 错误提示消息
     * @param data 响应数据
     * @return AjaxResponse
     */
    public static AjaxResponse error(CustomerExceptionTypeEnum customerExceptionTypeEnum, String errorMessage, Object data) {
        AjaxResponse ajaxResponse = new AjaxResponse();
        ajaxResponse.setFlag(false);
        ajaxResponse.setCode(customerExceptionTypeEnum.getCode());
        ajaxResponse.setMessage(errorMessage);
        ajaxResponse.setData(data);
        return ajaxResponse;
    }

    /**
     * 请求成功的响应，不带查询数据（用于删除、修改、新增接口）
     * @return AjaxResponse
     */
    public static AjaxResponse success() {
        AjaxResponse ajaxResponse = new AjaxResponse();
        ajaxResponse.setFlag(true);
        ajaxResponse.setCode(200);
        ajaxResponse.setMessage("请求响应成功！");
        return ajaxResponse;
    }

    /**
     * 请求成功的响应，带有查询数据（用于数据查询接口）
     * @param data 响应数据
     * @return AjaxResponse
     */
    public static AjaxResponse success(Object data) {
        AjaxResponse ajaxResponse = new AjaxResponse();
        ajaxResponse.setFlag(true);
        ajaxResponse.setCode(200);
        ajaxResponse.setMessage("请求响应成功！");
        ajaxResponse.setData(data);
        return ajaxResponse;
    }

    /**
     * 请求成功的响应，带有查询数据（用于数据查询接口）
     * @param data 响应数据
     * @param message 响应提示信息
     * @return AjaxResponse
     */
    public static AjaxResponse success(Object data, String message) {
        AjaxResponse ajaxResponse = new AjaxResponse();
        ajaxResponse.setFlag(true);
        ajaxResponse.setCode(200);
        ajaxResponse.setMessage(message);
        ajaxResponse.setData(data);
        return ajaxResponse;
    }
}
